# Python __slots__：限制类实例动态添加属性和方法
from distro import info
class CLanguage:
    pass

# 下面定义了一个实例方法
def info(self):
    print("正在调用实例方法")

# 下面定义了一个类方法
@classmethod
def info2(cls):
    print("正在调用类方法")

# 下面定义个静态方法
@staticmethod
def info3():
    print("正在调用静态方法")

# 类可以动态添加以上3种方法，会影响所有实例对象
CLanguage.info = info;
CLanguage.info2 = info2;
CLanguage.info3 = info3;

clang = CLanguage()
# 如今，clang具有以上3种方法
clang.info()
clang.info2()
clang.info3()

# 类实例对象只能动态添加实例方法，不会影响其他实例对象
clang1 = CLanguage()
clang1.info = info
# 必须手动为 self 传值
clang1.info(clang1)
print()

class CLanguage:
    __slots__ = ('name', 'add', 'info')

def info(self, name):
    print("正在调用实例方法", self.name)

clang = CLanguage()
clang.name = "C语言中文网"
# 为 clang 对象动态添加 info 实例方法
clang.info = info
clang.info(clang, "Python教程")

#clang.say = info # AttributeError: 'CLanguage' object has no attribute 'say'
#clang.say(clang, "Python教程")

def info(self):
    print("正在调用实例方法")

CLanguage.say = info
clang = CLanguage()
clang.say()
